﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using Modelo_ETdA.Negocio.Analise.Formato;
using Modelo_ETdA.Negocio.Analise;

namespace Modelo_ETdA.Interface
{
    public partial class RegistaFormatoCliente : Form
    {

        GestorAnalise gestor_analise;
        DataTable cons1 = new DataTable();
        DataTable cons2 = new DataTable();
        DataTable cons3 = new DataTable();
        DataTable cons4 = new DataTable();
        List<Consideracao> lConsideracoes;
        MenuAnaliseETdA mAnaletda;
        FormatoClienteCont next = null;

        public RegistaFormatoCliente(GestorAnalise gestor, MenuAnaliseETdA mAnaliseetda)
        {
            InitializeComponent();
            this.gestor_analise = gestor;
            mAnaletda = mAnaliseetda;
            lConsideracoes = gestor_analise.consultaListaConsideracao();
            nomeCons1.Text = lConsideracoes[0].Descricao;
            nomeCons2.Text = lConsideracoes[1].Descricao;
            nomecons3.Text = lConsideracoes[2].Descricao;
            nomecons4.Text = lConsideracoes[3].Descricao;
            inicializaTabelas(consideracao1, cons1);
            inicializaTabelas(consideracao2, cons2);
            inicializaTabelas(consideracao3, cons3);
            inicializaTabelas(consideracao4, cons4);
            if (lConsideracoes.Count == 4)
            {
                regist.Visible = true;
                novaCon.Visible = false;
            }
        }


        public FormatoAvaliacaoCliente registar(int controlo)
        {
            FormatoAvaliacaoCliente form_av = null;
            DocumentoCabecalho doc_cab = new DocumentoCabecalho(nomeForm.Text, "Cliente", new DateTime(), 1);


            try
            {
                form_av = new FormatoAvaliacaoCliente(gestor_analise.AmbComercialSessao.Cabeçalho.Cod, nomeForm.Text, Convert.ToInt32(valCli.Text), doc_cab);

                int linhas = consideracao1.Rows.Count, i = 0;
                while (linhas > i + 1)
                {
                    form_av.registMin(consideracao1.Rows[i].Cells[0].Value.ToString(), Convert.ToInt32(consideracao1.Rows[i].Cells[1].Value), Convert.ToInt32(consideracao1.Rows[i].Cells[2].Value), Convert.ToInt32(consideracao1.Rows[i].Cells[3].Value), Convert.ToInt32(consideracao1.Rows[i].Cells[4].Value) / 100f, lConsideracoes[0].Cod);
                    i++;
                }

                i = 0;
                linhas = consideracao2.Rows.Count;
                while (linhas > i + 1)
                {
                    form_av.registMin(consideracao2.Rows[i].Cells[0].Value.ToString(), Convert.ToInt32(consideracao2.Rows[i].Cells[1].Value), Convert.ToInt32(consideracao2.Rows[i].Cells[2].Value), Convert.ToInt32(consideracao2.Rows[i].Cells[3].Value), Convert.ToInt32(consideracao2.Rows[i].Cells[4].Value) / 100f, lConsideracoes[1].Cod);
                    i++;
                }

                i = 0;
                linhas = consideracao3.Rows.Count;
                while (linhas > i + 1)
                {
                    form_av.registMin(consideracao3.Rows[i].Cells[0].Value.ToString(), Convert.ToInt32(consideracao3.Rows[i].Cells[1].Value), Convert.ToInt32(consideracao3.Rows[i].Cells[2].Value), Convert.ToInt32(consideracao3.Rows[i].Cells[3].Value), Convert.ToInt32(consideracao3.Rows[i].Cells[4].Value) / 100f, lConsideracoes[2].Cod);
                    i++;
                }

                i = 0;
                linhas = consideracao4.Rows.Count;
                while (linhas > i + 1)
                {
                    form_av.registMin(consideracao4.Rows[i].Cells[0].Value.ToString(), Convert.ToInt32(consideracao4.Rows[i].Cells[1].Value), Convert.ToInt32(consideracao4.Rows[i].Cells[2].Value), Convert.ToInt32(consideracao4.Rows[i].Cells[3].Value), Convert.ToInt32(consideracao4.Rows[i].Cells[4].Value) / 100f, lConsideracoes[3].Cod);
                    i++;
                }

                if (controlo == 1)
                {
                    int res = gestor_analise.registaFormatoAvaliacao(form_av, 1, gestor_analise.AmbComercialSessao.Cabeçalho.Cod);
                    switch (res)
                    {
                        case 0:
                            MessageBox.Show("Formato registado com sucesso!", "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            break;
                        case 2:
                            MessageBox.Show("Nome de formato já registado!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            break;
                        default:
                            MessageBox.Show("Erro ao registar formato!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            break;
                    }

                    this.Visible = false;
                    mAnaletda.Visible = true;
                }
            }
            catch (Exception exp)
            {
                MessageBox.Show("Erro ao registar Formato!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Information);

            }
            return form_av;
        }


        public void inicializaTabelas(DataGridView grid1, DataTable tab)
        {
            tab.Columns.Add("Nome");
            tab.Columns.Add("Escala Mínima");
            tab.Columns.Add("Escala Máxima");
            tab.Columns.Add("Valor Mínimo");
            tab.Columns.Add("Ponderação %");
            tab.Columns["Nome"].MaxLength = 25;
            tab.Columns["Escala Mínima"].MaxLength = 3;
            tab.Columns["Escala Máxima"].MaxLength = 3;
            tab.Columns["Valor Mínimo"].MaxLength = 3;
            tab.Columns["Ponderação %"].MaxLength = 3;

            grid1.DataSource = tab;

            grid1.Columns[0].Width += 18;
            grid1.Columns[1].Width -= 20;
            grid1.Columns[3].Width -= 20;
            grid1.Columns[3].Width -= 20;
            grid1.Columns[4].Width -= 15;
        }

        private void novaCon_Click(object sender, EventArgs e)
        {
            try{
            try
            {
                if (valCli.TextLength > 0 || nomeForm.TextLength > 0)
                {
                    if (Convert.ToInt32(valCli.Text) > 100 || Convert.ToInt32(valCli.Text) < 0)
                    {
                        MessageBox.Show("A valorização do Cliente deve estar contida entre 0 e 100!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        valCli.Text = "1";
                        return;
                    }
                }
                else
                {
                    MessageBox.Show("Não preencheu os campos iniciais!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }
            catch (Exception es)
            {
                MessageBox.Show("Possuiu dados inválidos no campo Valorização do Cliente!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            if (validaDados() == 1) return;

            if (next != null)
            {
                next.Visible = true;
                this.Visible = false;
            }
            else
            {
                FormatoClienteCont formato = new FormatoClienteCont(mAnaletda, this, null, lConsideracoes, 4, gestor_analise);
                next = formato;
                formato.Visible = true;
                this.Visible = false;
            }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Não foi possível apresentar as considerações.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }



        private void RegistaFormatoCliente_FormClosed(object sender, FormClosedEventArgs e)
        {
            mAnaletda.sair();
        }

        public void testaInput(DataGridView grid, DataGridViewCellEventArgs e)
        {
            int linha, coluna;
            coluna = e.ColumnIndex;
            linha = e.RowIndex;
            try
            {
                switch (coluna)
                {
                    case 0:
                        if (grid.Rows[linha].Cells[coluna].Value.ToString().Length > 25)
                        {
                            grid.Rows[linha].Cells[coluna].Value = "";
                            MessageBox.Show("Nome da questão deve conter no máximo 25 caracteres!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);

                        }
                        break;

                    case 1:
                        if (grid.Rows[linha].Cells[coluna].Value.ToString().Length > 3)
                        {
                            grid.Rows[linha].Cells[coluna].Value = "";
                            MessageBox.Show("Escala mínima tem um máximo de 3 caracteres!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);

                        }
                        else
                            if (Convert.ToInt32(grid.Rows[linha].Cells[coluna].Value) < 0)
                            {
                                grid.Rows[linha].Cells[coluna].Value = "0";
                                MessageBox.Show("Escala mínima tem valor mínimo 0!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                        break;


                    case 2:
                        if (grid.Rows[linha].Cells[coluna].Value.ToString().Length > 3)
                        {
                            grid.Rows[linha].Cells[coluna].Value = "";
                            MessageBox.Show("Escala máxima tem um máximo de 3 caracteres!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);

                        }
                        else
                            if (Convert.ToInt32(grid.Rows[linha].Cells[coluna].Value) < 2)
                            {
                                grid.Rows[linha].Cells[coluna].Value = "2";
                                MessageBox.Show("Escala máxima tem valor mínimo 2!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                        break;
                    case 3:
                        if (grid.Rows[linha].Cells[coluna].Value.ToString().Length > 3)
                        {
                            grid.Rows[linha].Cells[coluna].Value = "";
                            MessageBox.Show("Mínimo deve conter no máximo 3 caracteres!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);

                        }
                        else
                            if (Convert.ToInt32(grid.Rows[linha].Cells[coluna].Value) < 0)
                            {
                                grid.Rows[linha].Cells[coluna].Value = "0";
                                MessageBox.Show("Mínimo tem valor mínimo 0!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }

                        break;

                    case 4:
                        if (grid.Rows[linha].Cells[coluna].Value.ToString().Length > 3)
                        {
                            grid.Rows[linha].Cells[coluna].Value = "";
                            MessageBox.Show("Ponderação % deve conter no máximo 3 caracteres!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);

                        }
                        else
                            if (Convert.ToInt32(grid.Rows[linha].Cells[coluna].Value) > 100 || Convert.ToInt32(grid.Rows[linha].Cells[coluna].Value) < 1)
                            {
                                grid.Rows[linha].Cells[coluna].Value = "1";
                                MessageBox.Show("Ponderação % tem valor máximo 100 e mínimo de 1!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }

                        break;

                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Inseriu valores inválidos!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                grid.Rows[linha].Cells[coluna].Value = "";
            }
        }

        public int validaDados()
        {
            try
            {
                if (verificaDadosConsideracao(cons1, lConsideracoes[0].Descricao) == 1) return 1;
                if (verificaDadosConsideracao(cons2, lConsideracoes[1].Descricao) == 1) return 1;
                if (verificaDadosConsideracao(cons3, lConsideracoes[2].Descricao) == 1) return 1;
                if (verificaDadosConsideracao(cons4, lConsideracoes[3].Descricao) == 1) return 1;

            }
            catch (Exception ex)
            {
                return 1;
            }
            return 0;

        }


        public int verificaDadosConsideracao(DataTable grid, String nome)
        {
            int i = 0, counter = 0;
            try
            {
                while (i < grid.Rows.Count)
                {
                    if (Convert.ToInt32(grid.Rows[i][1]) > Convert.ToInt32(grid.Rows[i][3]) || Convert.ToInt32(grid.Rows[i][2]) < Convert.ToInt32(grid.Rows[i][3]))
                    {
                        MessageBox.Show("Possuiu campos em que o valor mínimo está em conflito com os valores da escala na consideração " + nome + "!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return 1;
                    }

                    if (Convert.ToInt32(grid.Rows[i][1]) >= Convert.ToInt32(grid.Rows[i][2]))
                    {
                        MessageBox.Show("Possuiu campos em que a escala mínima é maior ou igual à escala máxima na consideração " + nome + "!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return 1;
                    }

                    counter += Convert.ToInt32(grid.Rows[i][4]);
                    i++;
                }
                if (counter != 100 && grid.Rows.Count > 0)
                {
                    MessageBox.Show("A soma das ponderações na consideração " + nome + " não é igual a 100!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return 1;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Não preencheu todos os valores!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return 1;
            }
            return 0;
        }



        private void consideracao1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            testaInput(consideracao1, e);
        }

        private void consideracao2_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            testaInput(consideracao2, e);
        }

        private void consideracao3_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            testaInput(consideracao3, e);
        }

        private void consideracao4_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            testaInput(consideracao4, e);
        }

        private void regist_Click(object sender, EventArgs e)
        {
            try
            {
                registar(1);
                mAnaletda.Visible = true;
                this.Visible = false;
            
            }
            catch (Exception ex)
            {
                MessageBox.Show("Não foi possível registar formato!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void voltar_Click(object sender, EventArgs e)
        {
            mAnaletda.Visible = true;
            this.Visible = false;
        }

        private void RegistaFormatoCliente_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                regist_Click(this, null);
            }

            if (e.KeyCode == Keys.Back)
            {
                voltar_Click(this, null);
            }
        }




    }
}
